package com.bo.ioc;

import com.bo.ioc.component.UserComponent;
import com.bo.ioc.config.UserConfig;
import com.bo.ioc.controller.*;
import com.bo.ioc.model.UserInfo;
import com.bo.ioc.repo.UserRepo;
import com.bo.ioc.repo.UserRepo1;
import com.bo.ioc.repo.UserRepo2;
import com.bo.ioc.service.UserService;
import jdk.swing.interop.SwingInterOpUtils;
import org.apache.catalina.User;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.ComponentScan;

// @ComponentScan:强制改变启动类扫描路径
@ComponentScan(basePackages = "com.bo.ioc")
@SpringBootApplication
public class SpringIocDemoApplication {
	public static void main(String[] args) {
		// 这是启动类的run方法,通过ApplicationContext能够获取"应用上下文"
		// SpringApplication.run(SpringIocDemoApplication.class, args);
		ApplicationContext context = SpringApplication.run(SpringIocDemoApplication.class, args);
//
//		// 1. 通过"类型"获取Bean
//		UserController Bean1 = context.getBean(UserController.class);
//		Bean1.run();
//
//		// 2. 通过"类名"获取Bean(类的小驼峰)
//		UserController Bean2 = (UserController) context.getBean("userController");
//		Bean2.run();
//
//		// 3. 通过"类型"和"类名"获取Bean
//		UserController Bean3 = context.getBean("userController", UserController.class);
//		Bean3.run();
//
//		// 地址相同
//		System.out.println(Bean1);
//		System.out.println(Bean2);
//		System.out.println(Bean3);
//
//		// 类名前两个字母都是大写的类:
//		// 通过名字获取Bean,虽然正常来说是小驼峰,但当"前两个字母都是大写时",名字为类名
//		// error:UController Bean4 = context.getBean("uController");
//		UController Bean4 = (UController) context.getBean("UController");
//		Bean4.run();
//
//		// 获取@Service下的Bean
//		UserService Bean5 = (UserService) context.getBean("userService");
//		Bean5.run();
//
//		// 获取@Component下的Bean
//		UserComponent Bean6 = (UserComponent) context.getBean("userComponent");
//		Bean6.run();
//
//		// 获取@Configuration下的Bean
//		UserConfig Bean7 = (UserConfig) context.getBean("userConfig");
//		Bean7.run();
//
//		// 获取@Repository下的Bean
//		UserRepo Bean8 = (UserRepo) context.getBean("userRepo");
//		Bean8.run();
//
//		// 获取UserComponent中,@Bean下的(UserInfo)Bean
//		UserInfo Bean9 = (UserInfo) context.getBean("userInfo1");
//		UserInfo Bean10 = (UserInfo) context.getBean("userInfo2");
//		System.out.println(Bean9);
//		System.out.println(Bean10);
//		System.out.println("------------------------------------------------");
//		// 测试三种依赖注入方法:
//		// 1. 字段注入(UserConfig)
//		UserConfig repo = (UserConfig) context.getBean("userConfig");
//		repo.thoRun();
//		// 2. 构造方法注入(UserRepo)
//		UserRepo r = (UserRepo) context.getBean("userRepo");
//		r.thoRun();
//		// 2. 构造方法注入(UserRepo) -- 类中有两个UserInfo的@Bean(@Qualifier)
//		UserRepo1 repo1 = (UserRepo1) context.getBean("userRepo1");
//		repo1.thoRun();
//		// 2. 构造方法注入(UserRepo) -- 类中有两个UserInfo的@Bean(@Primary)
//		UserRepo2 repo2 = (UserRepo2) context.getBean("userRepo2");
//		repo2.thoRun();
//
 		YamlController controller = (YamlController) context.getBean("yamlController");
// 		prop/run3 : (都换行)
// 		Hello \n Spring Boot
// 		Hello \n Spring Boot
// 		Hello
// 		 Spring Boot
// 		yaml/run3 : (只有双引号换行)
// 		Hello
// 		Spring Boot
//'		Hello
// 		Spring Boot'
//"		Hello
// 		Spring Boot"
 		controller.run4();
 		controller.run5();

		LoggerController logger = (LoggerController) context.getBean("loggerController");
 		logger.errorRun();
		logger.warnRun();
		logger.infoRun();
		logger.debugRun();// 打印这俩需要去yml配置
		logger.traceRun();
	}
}


